package mysql8学习.高级.第12章_数据库调优的其他策略;

/**
 * 1.4调优的维度和步骤
 * 我们需要调优的对象是整个数据库管理系统，它不仅包括SQL查询，还包括数据库的部署配置、架构等。
 * 从这个角度来说，我们思考的维度就不仅仅局限在SQL优化上了。
 * 通过如下的步骤我们进行梳理:
 *
 * 第1步:选择适合的DBMS
 * 如果对事务性处理以及安全性要求高的话，可以选择商业的数据库产品。
 * 这些数据库在事务处理和查询性能上都比较强，比如采用SQL Server. Oracle,
 * 那么单表存储上亿条数据是没有问题的。如果数据表设计得好，即使不采用分库分表的方式，查询效率也不差。
 * 除此以外，你也可以采用开源的MySQL进行存储，它有很多存储引擎可以选择,
 *         如果进行事务处理的话可以选择InnoDB,非事务处理可以选择MyISAM。
 * NoSQL阵营包括 键值型数据库、文档型数据库 、搜索引擎、 列式存 储和图形数据库。
 * 这些数据库的优缺点和使用场景各有不同，比如列式存储数据库可以大幅度降低系统的I/O,适合于分布式文件系统，
 * 但如果数据需要频繁地增删改，那么列式存储就不太适用了。
 * DBMS的选择关系到了后面的整个设计过程，所以第一步就是要选择适合的 DBMS。
 * 如果已经确定好了DBMS,那么这步可以跳过。
 *
 * 第2步:优化表设计
 * 选择了DBMS之后，我们就需要进行表设计了。而数据表的设计方式也直接影响了后续的SQL查询语句。
 * RDBMS中，每个对象都可以定义为一张表，与表之间的关系代表了对象之间的关系。
 * 如果用的是MySQL,我们还可以根据不同表的使用需求，选择不同的存储引擎。
 * 除此以外,还有一些优化的原则可以参考:
 * 1.表结构要尽量遵循三范式的原则。这样可以让数据结构更加清晰规范，减少冗余字段，
 *   同时也减少了在更新,插入和删除数据时等异常情况的发生。
 * 2.如果查询应用比较多,尤其是需要进行多表联查的时候，可以采用反范式进行优化。
 *   反范式采用空间换时间的方式，通过增加冗余字段提高查询的效率。
 * 3.表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。
 *   一般来说，如果字段可以采用数值类型就不要采用字符类型;
 *   字符长度要尽可能设计得短一些。
 *   针对字符类型来说，当确定字符长度固定时,就可以采用CHAR类型;
 *   当长度不固定时，通常采用VARCHAR类型。
 * 数据表的结构设计很基础，也很关键。
 * 好的表结构可以在业务发展和用户量增加的情况下依然发挥作用，
 * 不好的表结构设计会让数据表变得非常臃肿，查询效率也会降低。
 *
 * 第3步:优化逻辑查询
 * 当我们建立好数据表之后，就可以对数据表进行增删改查的操作了。
 * 这时我们首先需要考虑的是逻辑查询优化。
 * SQL查询优化，可以分为逻辑查询优化和物理查询优化。
 *   逻辑查询优化就是通过改变SQL语句的内容让SQL执行效率更高效，
 *   采用的方式是对SQL语句进行等价变换，对查询进行重写。
 * SQL的查询重写包括了子查询优化等价谓词重写、视图重写、条件简化、连接消除和嵌套连接消除等。
 * 比如我们在讲解EXISTS子查询和IN子查询的时候，会根据小表驱动大表的原则选择适合的子查询。
 * 在WHERE子句中会尽量避免对字段进行函数运算,它们会让字段的索引失效。
 *
 * 第4步:优化物理查询
 * 物理查询优化是在确定了逻辑查询优化之后，采用物理优化技术(比如索引等)，
 * 通过计算代价模型对各种可能的访问路径进行估算，从而找到执行方式中代价最小的作为执行计划。
 * 在这个部分中,我们需要掌握的重点是对索引的创建和使用。
 * 但索引不是万能的，我们需要根据实际情况来创建索引。
 * 那么都有哪些情况需要考虑呢? 我们在前面几章中已经进行了细致的剖析。
 * SQL查询时需要对不同的数据表进行查询，因此在物理查询优化阶段也需要确定这些查询所采用的路径，
 * 具体的情况包括:
 * 1. 单表扫描: 对于单表扫描来说，我们可以全表扫描所有的数据，也可以局部扫描。
 * 2. 两张表的连接:常用的连接方式包括了嵌套循环连接、HASH连接和合并连接。
 * 3. 多张表的连接:多张数据表进行连接的时候，
 *    顺序很重要，因为不同的连接路径查询的效率不同，搜索空间也会不同。
 *    我们在进行多表连接的时候，搜索空间可能会达到很高的数据量级，巨大的搜索空间显然会占用
 *    更多的资源，因此我们需要通过调整连接顺序，将搜索空间调整在一个可接受的范围内。
 *
 * 第5步:使用Redis或Memcached作为缓存
 * 除了可以对SQL本身进行优化以外,我们还可以请外援提升查询的效率。
 * 因为数据都是存放到数据库中，我们需要从数据库层中取出数据放到内存中进行业务逻辑的操作，
 * 当用户量增大的时候，如果频繁地进行数据查询，会消耗数据库的很多资源。
 * 如果我们将常用的数据直接放到内存中，就会大幅提升查询的效率。
 * 键值存储数据库可以帮我们解决这个问题。
 * 常用的键值存储数据库有Redis和Memcached,它们都可以将数据存放到内存中。
 * 从可靠性来说，Redis 支持持久化，可以让我们的数据保存在硬盘上,不过这样一来性能消耗也会比较大。
 * 而Memcached仅仅是内存存储,不支持持久化。
 * 从支持的数据类型来说，Redis 比Memcached要多,它不仅支持key-value类型的数据，
 * 还支持List, Set, Hash等数据结构。
 * 当我们有持久化需求或者 是更高级的数据处理需求的时候，就可以使用Redis。
 * 如果是简单的key-value存储，则可以使用Memcached。
 *
 * 通常我们对于查询响应要求高的场景(响应时间短，吞吐量大)，可以考虑内存数据库，毕竟术业有专攻。
 * 传统的RDBMS都是将数据存储在硬盘上,而内存数据库则存放在内存中，查询起来要快得多。
 * 不过使用不同的工具，也增加了开发人员的使用成本。
 *
 * 第6步:库级优化
 *   库级优化是站在数据库的维度上进行的优化策略，比如控制一个库中的数据表数量。
 *   另外，单一的数据库总会遇到各种限制，不如取长补短，利用"外援"的方式。
 *   通过主从架构优化我们的读写策略，通过对数据库进行垂直或者水平切分，
 *   突破单一数据库或数据表的访问限制， 提升查询的性能。
 *   1、读写分离
 *     如果读和写的业务量都很大，并且它们都在同一个数据库服务器中进行操作,那么数据库的性能就会出现瓶颈,
 *     这时为了提升系统的性能，优化用户体验,我们可以采用读写分离的方式降低主数据库的负载，
 *     比如用 主数据库(master)完成写操作，用 从数据库(slave) 完成读操作。
 *   2、数据分片
 *      对数据库分库分表。当数据量级达到千万级以上时,有时候我们需要把一个数据库切成多份,
 *      放到不同的数据库服务器上，减少对单一数据库服务器的访问压力。
 *      如果你使用的是MySQL,就可以使用MySQL自带的分区表功能，
 *      当然你也可以考虑自己做垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分 (分库分表) 。
 *
 * 但需要注意的是，分拆在提升数据库性能的同时，也会增加维护和使用成本。
 *
 */
public class A4_调优的维度和步骤 {
}
